package modelo.geometria;



enum Direccion {POSITIVA , NEGATIVA }

enum SentidoRotacion {HORARIO, ANTIHORARIO}


public class Movimientos {

	
	static // supongo que obtengo los 4 vertices del rectangulo

    // variables harcodeadas esto viene de rectangulo
    //   x00 = rectangulo.getX00();
    //	 ... 
	//   xNN = rectangulo.getXNN(); o como se llame 
		
		Vector x00 = new Vector(0,0);  
		static Vector x0N = new Vector(0,5);
		static Vector xM0 = new Vector(5,0);
		static Vector xMN = new Vector(5,5);
		
	
	
	
	private static boolean avancePositivoRotar45(SentidoRotacion sentido)
	{
		
		switch (sentido){
		
		case HORARIO:	{
		
							rotacionMatricial(x00,45);
							rotacionMatricial(x0N,45);
							rotacionMatricial(xMN,45);
							return true;
						}
		case ANTIHORARIO:
						{
							rotacionMatricial(xM0,-45);
							rotacionMatricial(x0N,-45);
							rotacionMatricial(xMN,-45);
							return true;		
						}
		}
		
		
		return false;
		
	}
	
	private static boolean avanceNegativoRotar45(SentidoRotacion sentido)
	{
		
		switch (sentido){
		
		case HORARIO:	{
							rotacionMatricial(x00,45);
							rotacionMatricial(xM0,45);
							rotacionMatricial(xMN,45);
							return true;
						}
		case ANTIHORARIO:	{
							rotacionMatricial(x00,-45);
							rotacionMatricial(xM0,-45);
							rotacionMatricial(x0N,-45);
							return true;		
						}
		}
		
		return false;

		
		
	}
	
	public static boolean rotar45(Rectangulo rectangulo,Direccion direccion, SentidoRotacion sentido) {
		
	
		
		
		switch (direccion){
		case POSITIVA:{
						return avancePositivoRotar45(sentido);
					  }
		case NEGATIVA:{
			
						return avanceNegativoRotar45(sentido);
					  }
		}
	
	return false;
	
	}
	
	
	
	
	
	// recibe un punto y un angulo en grados y retorna el punto transformado
	private static Vector rotacionMatricial(final Vector posicion, double theta) {
		
		
		double R[][] = new double[3][3]; // matriz de rotacion 
		double x[] = new double[3];
		double v[] = new double [3];
		
		
		R[0][0] = Math.cos(theta);
		R[0][1] = (-1)* Math.sin(theta);
		R[0][2] = 0;
		
		R[1][0] = Math.sin(theta);
		R[1][1] = Math.cos(theta);
		R[1][2] = 0;
		
		R[2][0] = 0;
		R[2][1] = 0;
		R[2][2] = 1;
		
		x[0] = posicion.getX();
		x[1] = posicion.getY();
		x[2] = 1;
         
		v[0] = 0;
		v[1] = 0;
		v[2] = 0;
		
		
		// Producto matricial Ax = v (esta tendria que ser una operacion de posicion)
		// public static Posicion productoMatricial( double matriz[][]) lo dejo asi para no romper
		// al comitear...
		
		for (int i = 0; i < 3; i++)
			for (int j = 0; j < 3; j++)
			{
				{v[i] = (v[i]  + (R[i][j] * x[j] ) );}
			}
		
		
		return new Vector(v[0],v[1]);
	}
		
}
